LIME 事后解析方法

LIME, 全称为 Local Interpretable Model-Agnostic Explanation, 是一种与模型无关的局部解释算法。关于 LIME 算法的理解, 我们主要侧重于如下两个方面, 一个是与模型无关, 另一个是局部解释。由于 LIME 算法使用的数据只有原始输人特 征集及模型预测值, 因此 LIME 算法对模型的种类并无要求,可以是像 XGBoost 的集成树㭥型, 也可以是神经网络模型, 这 就是与模型无关的含义。同时, LIME 还是一个局部解释算法, 通过对单个样本构建局部代理模型, 可以找到该样本的各个特征取值对最后的模型预测值的影响。下面就从局部代理模型思想开始讲起, 然后具体介绍 LIME 中的算法流程, 以及如何实现可解释性, 最后指出 LIME 的优势及局限所在。

局部代理模型

局部代理模型属于可解释机器学习中的一种事后解释思想。局部, 顾名思义, 是只解释单个样本的模型预测值。代理模型的意思是, 使用黑盒模型对样本进行预测, 得到结果后, 再运用简单易懂的模型 (比如, 线性回归、决策树等), 重新拟合样本特征与黑盒模型预测值之间的关系。这里的简单易懂模型, 相当于是黑盒模型的一个代理人。模型使用者可以通过简单模型理解黑盒模型所发现的规律。

LIME 可以处理不同输人类型的数据, 如常用的表格数据、图像数据或文本数据。对于表格数据, 例如, 用银行客户的行为数据来预测理财产品的销售, 训练完复杂模型后, 可以用 LIME 得到影响产品销售成功的那些特征; 对于图像数据, 例如, 识别图片中的动物是否为猫, 训练完复杂模型后, 可以用 LIME 得到图片中的动物被识别为猫, 是因为哪一个或几个像素块; 对于文本数据, 例如, 识别短信是否为垃圾短信, 训练完复杂模型后, 可以用 LIME 得到一条信息被判断为垃圾短信, 是因为哪一个或几个关键词。

LIME 的目标是找到单个样本的模型预测值与特征之间的线性关系。而解决该回题的思路是, 当变动单个样本的特征数据时, 观察黑盒槿型的预测结果会有什么样的变化。收集这些新的特征数据及对应的模型预测值, 来拟合稀疏线性回归模型, 同时也对模型的复杂度加入惩罚。

LIME 方法的基本流程

LIME 的算法需要输人某个想要解释的样本和已经训练好的复杂模型。下面是基于表格数据的整套算法步骤。 1) 在预测样本附近随机取样。

对于连续型的特征, LIME 在输人样本的连续特征取值附近,用标准正态分布 $N(0,1)$ 来生成特定数目的新值;对于类别型特征, 则是根据训练集的分布进行采样。例如, 输人的单个样本为 $x^*=\left(x_1, x_2, \cdots, x_p\right)$, 有 $p$ 个特征, 其中第 $i$ 个 特征为连续型特征, 该特征在整个训练集中的标准差为 $\sigma_i$, 在 该样本中的取值为 $x_i$ 。在该样本附近生成的一个新样本 $z^*=$ $\left(z_1, z_2, \cdots, z_p\right)$, 其中的 $z_i=a_i \times \sigma_i+x_i, a_i$ 是通过标准正 态分布 $N(0,1)$ 生成的一个随机数。用同样的方法重复 $N$ 次, 最后生成 $N$ 个新样本 $z_k^*, k=1,2, \cdots, N$ 。

2) 对新生成的样本打标签。
将新生成的 $N$ 个样本 $z_k^*, k=1,2, \cdots, N$, 放入已经训练好的复杂模型中, 得到 $N$ 个预测结果。假设训练好的复杂模型记为 $f$, 则新生成的样本模型预测结果为 $f\left(z_1^*, z_2^*, \cdots, z_{\dot{N}}^*\right)$ 。

3) 根据新生成的样本到输入样本的距离, 计算相应的权重。
新生成的样本距离要解释的样本越近, 意味着新样本可以更好地代表要解释的样本, 因此会对其赋予更高的权重。我们可以用指数核函数 (exponential kernel) 来定义权重, 即 $\prod\left(z_k^*\right)=\exp \left(\frac{-D\left(x^*, z_k^*\right)^2}{\sigma^2}\right)$ 。这里的 $D\left(x^*, z_k^*\right)^2$ 是指某一个新生成的样本 $z_k^*$ 到输入样本 $x^*$ 的距离函数, $\sigma$ 为超参数。从该核函数的公式中我们可以看到, 距离越近, $\prod\left(z_k^*\right)$ 的值越大。

4) 先筛选出特征, 再拟合出线性回归模型。
为了得到更简单的模型结果解释, 我们可以使用 Forward Selection 和 Lasso Path 等方法先筛选特征, 并自行设定具体留下来的特征数量。假设最终用来解释的样本特征只有 $p^{\prime}\left(p^{\prime} \leqslant\right.$ $p)$ 个, 那么用来解释的特征为 $z^{\prime}=\left(z_{(1)}, z_{(2)}, \cdots, z_{\left(p^{\prime}\right)}\right)$, 此 处, $z_{(1)}$ 与 $z_1$ 不一定相等, 只是用来表示从 $p$ 个特征中选取 $p^{\prime}$ 个特征来解释。

第二步是用选出的 $p^{\prime}$ 个特征来拟合线性回归。 假设用来解释的线性回归模型是 $g\left(z^{\prime}\right)=\omega_R \cdot z^{\prime}=\omega_0+$ $\omega_1 z_{(1)}+\cdots+\omega_{p^{\prime}} z_{\left(p^{\prime}\right)}$, 为了求出线性模型的系数 $\omega_g=\left(\omega_0\right.$, $\left.\omega_1, \cdots, \omega_{p^{\prime}}\right)$, LIME 使用的是加权平方损失函数, $L(f, g$, $\left.\prod\right)=\sum_{k=1}^N \prod_{x^*}\left(z_k^*\right)\left(f\left(z_k^*\right)-g\left(z_k^{\prime}\right)\right)^2$, 找出使损失函数最小 的 $\omega_g$ 即可。

LIME 方法的解释

首先, 我们从局部解释的角度, 利用 LIME 方法作事后解析。

对于单个样本, 我们在其附近抽样得到新的样本, 并用训练好的复杂模型得到预测值。基于这些新模拟的特征值和目标值, 我们最终拟合出线性回归来代理复杂模型。因此, 我们要充分挖掘线性回归模型 $g\left(z^{\prime}\right)=\omega_g \cdot z^{\prime}=\omega_0+\omega_1 z_{(1)}+\cdots+\omega_{p^{\prime}} z_{\left(p^{\prime}\right)}$ 中的信息。

解释的特征数目 $p^{\prime}$ 虽然是模型使用者自己设定的数字, 但是最后留下的, 是在该样本的信息条件下,其在某一个方面的重要性考前的特征个数。然后, 运用这些特征二次拟合得到的线性回归中的系数 $\omega_g=\left(\omega_0, \omega_1, \cdots, \omega_{p^{\prime}}\right)$, 其系数的大小代 表该特征的重要性高低, 系数的正们代表该特征对最终模型预 测值影响的方向, 正号代表当该特征增加一个单位时,模型的 预测值会相应地增加, 反之亦然。系数为负,代表当该特征塻加一个单位时, 模型的预测值会相应地下降。

下面我们使用 Python 中的 lime库, 在乳腺癌数据集中进行实践。使用该数据集中的30个特征, 目标是预测个人是否患有乳腺癌。

代码实现

from sklearn.datasets import load_breast_cancer,load_iris
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import lime
import lime.lime_tabular
import matplotlib.pyplot as plt

data = load_iris()
df  = pd.DataFrame(data['data'],columns=data['feature_names'])
df['target'] = data['target']
X,y = df.iloc[:,:-1],df['target']
X_train,X_test,y_train,y_test = train_test_split(X,y,train_size=0.7)

rf = RandomForestClassifier(n_estimators=500)
rf.fit(X_train,y_train)
explainer = lime.lime_tabular.LimeTabularExplainer(X_train,feature_names=X.columns,verbose=True,
                                                   feature_selection='highest_weights',
                                                  class_names=y.name,discretize_continuous=False)
plt.figure()
exp = explainer.explain_instance(X_test.iloc[0,:],rf.predict_proba,num_features=5)
exp.show_in_notebook(show_table=True,show_all=True)
plt.show()

LIME 方法的优劣

作为一种与模型无关的事后解释方法, LIME 的第一个优点是应用比较广泛, 表格数据、图像或文本领域者可以使用。 另一方面, 无论之前对数据集使用的是哪种模型, SVM(支持 向量机)、XGBoost 或神经网络模型, 都可以用 LIME 来解释。 LIME的第二个优点是, 所得到的解释结果, 也可以用来诊断复杂模型, 例如, 如果发现某些特征变量对目标变量的影响是不符合业务经验的, 就可以用其检验模型发现的规律。LIME 的第三个优点是, 我们可以度旺出该局部代理模型接近单个样 本的黒盒模型预测值的程度。具体可以通过计算. LIME 对单个 样本的预测值, 与黑盒模型预测值之间的距离来作为度量标 准。LIME 的第四个优点是, LIME 可能会使用原有模型中末 使用到的, 但是易于理解的特征, 例如, 一个文本分类器用单 词编码之后的特征入模, 但是解释的时候可以用衍生的变量 (比如, 这个单词在句子中是否出现过), 来拟合局部代理模 型。相对于原特征, 这个新特征更容易解释。

LIME 的局限性首先在于解释的不稳定性, 不稳定性主要来自于对要解释的样本进行抽样所带来的随机性, 重新抽样后再拟合模型, 单个样本中关于特征的重要性可能会发生些许变化。第二点, 只进行正态抽样会忽略掉特征之间的相关性, 导致产生一些不合理的样本。最后, 关于核函数(权重)的设置需 要进行多次尝试, 以判断得到的解释是否合理。

万物都处于发展的过程中, 作为局部代理模型中具象化出来的模型, LIME 具有很大的前景。相信科学家们通过自己的智慧会慢慢解决上述问题的,LIME的发展也会越来越完善。

参考资料: